///\todo upgrade

//////////////////////////////////////////////////////////////////////////////////
//                                                                              //
//  This file is part of the buola project (https://code.google.com/p/buola/).  //
//                                                                              //
//  Copyright(c) 2007-2012 Xavi Gratal                                          //
//  gratal AT gmail DOT com                                                     //
//                                                                              //
//  Buola is free software: you can redistribute it and/or modify               //
//  it under the terms of the GNU General Public License as published by        //
//  the Free Software Foundation, either version 3 of the License, or           //
//  (at your option) any later version.                                         //
//                                                                              //
//  Buola is distributed in the hope that it will be useful,                    //
//  but WITHOUT ANY WARRANTY; without even the implied warranty of              //
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               //
//  GNU General Public License for more details.                                //
//                                                                              //
//  You should have received a copy of the GNU General Public License           //
//  along with buola.  If not, see <http://www.gnu.org/licenses/>.              //
//                                                                              //
//////////////////////////////////////////////////////////////////////////////////

#ifndef _CDBQUERY_H_
#define _CDBQUERY_H_

#include <buola/db/detail/cdbqueryimpl.h>

namespace buola {

class CDatabase;

class CDBQuery
{
public:
    CDBQuery()   {}

    explicit CDBQuery(CDatabase &pDatabase,const std::string &pQuery=std::string())
    {
        Create(pDatabase,pQuery);
    }

    CDBQuery(const CDBQuery &pO)
        :   mImpl(pO.mImpl)
    {}

public:
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
//////////////////////////////// Interface ////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
    void Create(CDatabase &pDatabase,const std::string &pQuery=std::string());

    void Prepare(const std::string &pQuery)    {   mImpl->Prepare(pQuery); }

    void BindBlob(int pN,const void *pData,std::size_t pSize,bool pCopy=true)
            {   mImpl->BindBlob(pN,pData,pSize,pCopy);  }
            void BindInteger(int pN,int64_t pValue)
            {   mImpl->BindInteger(pN,pValue);          }
    void BindString(int pN,const std::string &pValue,bool pCopy=true)
            {   mImpl->BindString(pN,pValue,pCopy);     }
    void BindDouble(int pN,double pValue)
            {   mImpl->BindDouble(pN,pValue);           }
    void BindNull(int pN)
            {   mImpl->BindNull(pN);                    }

    void ResetBindings()   {   mImpl->ResetBindings(); }

    std::size_t ColumnLength(int pN)    {   return mImpl->ColumnLength(pN);     }
    const void *ColumnBlob(int pN) {   return mImpl->ColumnBlob(pN);       }
    int64_t ColumnInteger(int pN)      {   return mImpl->ColumnInteger(pN);    }
    std::string ColumnString(int pN)   {   return mImpl->ColumnString(pN);     }
    double ColumnDouble(int pN)    {   return mImpl->ColumnDouble(pN);     }
    bool ColumnNull(int pN)        {   return mImpl->ColumnNull(pN);       }

    void Exec()    {   mImpl->Exec();   }
    bool NextRow() {   return mImpl->NextRow();    }
    void Reset()   {   mImpl->Reset();  }

    int64_t GetLastInsertID()  {   return mImpl->GetLastInsertID();    }

private:
////////////////////////////////////////
////////////////////////////////////////
///////////////// DATA /////////////////
////////////////////////////////////////
////////////////////////////////////////
    intrusive_ptr<detail::CDBQueryImpl> mImpl;
};

/*namespace buola*/ }

#endif
